#include <vector>
#include <map>
#include <string>
#include <memory>

using std::vector;
using std::map;
using std::string;
using std::shared_ptr;
using std::make_shared;

namespace Json
{
	class json_value;
	class json
	{
	public:
		enum Type
		{
			Null,Bool,Int,Double,String,Array,Object
		};

		using array=vector<json>;
		using object=map<string,json>;


		json(){};
		json(double);
		json(int);
		json(const string &);
		json(const char *);		//存在的原因是：因为只能一次隐式转换，所以char*类型不能直接转化成json
		json(string &&);
		json(const array &);
		json(array &&);
		json(const object &);
		json(object &&);

		string print() const;
		void print(string &out)const;

		Type type() const;


		//获取原始数据的const引用
		const json &operator[](int sz)const;
		const json &operator[](const string &sz)const;
		const int 				&get_int()const;			
		const double 			&get_double()const;	
		const string 			&get_str()const;		
		const json::array		&get_array()const;	
		const json::object		&get_object()const;

        //非cosnt引用
        json &operator[](int sz);
        json &operator[](const string &sz);
        json::array		&get_array();
        json::object	&get_object();

        void set_int(int value);
        void set_double(double value);
        void set_string(const string &value);

    private:
		shared_ptr<json_value> m_ptr;//如何对其进行深copy
	};

}